package ArrayList;
//基于 ArrayList 实现洗牌和发牌

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

//表示玩家的手牌
class handCard{
    private ArrayList<Card> cards;
}

//使用 ArrayList 表示一张牌
class Card{
    private String suit;
    private String rank;

    public Card(String suit, String rank) {
        this.suit = suit;
        this.rank = rank;
    }
    public String getSuit(){
        return this.suit;
    }
    public String getRank(){
        return this.rank;
    }
    public void setSuit(String suit){
        this.suit = suit;
    }
    public void setRank(String rank){
        this.rank = rank;
    }

    @Override
    public String toString() {
        return "Card{" +
                "suit='" + suit + '\'' +
                ", rank='" + rank + '\'' +
                '}';
    }
}
public class Demo01 {
    public static void main(String[] args) {

        //这里创建了衣服新牌 ， 然后通过调用函数 ， 将创建的一副牌赋值给了 deck
        ArrayList<Card> deck = createDeck();
        System.out.println("原始的牌：");
        System.out.println(deck);

        //洗牌 打乱牌的顺序 标准库中提供了shuffle方法
        System.out.println("打乱后的牌：");
//        Collections.shuffle(deck);
        shuffle(deck);
        System.out.println(deck);

        //发牌 ， 假设有三个人 ， 每个人发五张（三行五列的二维数组）
        //hands 也是一个 ArrayList 里面的每个元素也是一个 ArrayList , 并且当前 hands 长度为 0
        ArrayList<ArrayList<Card>> hands = new ArrayList<>();
//        ArrayList<handCard> handCards = new ArrayList<>();
        //往 hands 里面添加三个元素 ， 表示三个玩家的手牌
        for (int i = 0; i < 3; i++) {
            ArrayList<Card> hand = new ArrayList<>();
            hands.add(hand);
        }

        //给三人轮流发牌 ， 重复五次
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                //得到每一个玩家对象
                ArrayList<Card> currentHand = hands.get(j);
                //取出第一张牌
                Card card = deck.remove(0);
                currentHand.add(card);
            }
        }


        //打印每个人的手牌
        for (int i = 0; i < 3; i++) {
            System.out.println("第" + i +"个人都手牌："+hands.get(i));
        }
    }
    //自己实现以下洗牌操作
    public static void shuffle(ArrayList<Card> deck){
        //打乱扑克牌
        //把整个 ArrayList 从后往前遍历
        //针对每次取到一张牌 ， 就生成一个随机的下标 ， 拿着当前位置的牌和生成的随机下标位置的牌 ， 进行交换

        //实例化一个随机数的对象
        Random random = new Random();
        for (int i = deck.size()-1; i > 0; i--) {
            //生成 deck.size() 范围内的随机数
            int j = random.nextInt(deck.size());
            //交换两张牌的位置
            //生成一副临时牌 , 用于存储 i 位置的牌面（其实是相当于复制了一份 i 位置的牌面）
            Card temp = new Card(deck.get(i).getSuit(),deck.get(i).getRank());
            //把下标为 i 的位置设置为 deck.get(i)
            deck.set(i,deck.get(j));
            //将 j 位置的牌设置为刚刚临时创建用于存储 i 的temp
            deck.set(j,temp);

        }
    }
    public static ArrayList<Card> createDeck(){
        //创建一副扑克牌
        ArrayList<Card> deck = new ArrayList<Card>();
        String[] suits = {"♠", "♥", "♦", "♣"};
        for(String suit :suits){
            //在每个花色中生成对应点数的牌
            for (int i = 2; i <= 10; i++) {
                Card card = new Card(suit,""+i);
                //将生成的 一种花色的十张牌 添加到 ArrayList<Card> 的数组 deck 中
                deck.add(card);
            }
            //继续考虑 J Q K A
            Card cardJ = new Card(suit, "A");
            Card cardQ = new Card(suit, "A");
            Card cardK = new Card(suit, "A");
            Card cardA = new Card(suit, "A");
            deck.add(cardJ);
            deck.add(cardQ);
            deck.add(cardK);
            deck.add(cardA);

        }
        return deck;
    }
}

